<?php

namespace maotool\util;

class UrlUtil
{

        /**
     * 检查URL是否有效
     * @param string $url 待检查的URL
     * @return bool URL是否有效
     */
    public static function isValid($url)
    {
        return filter_var($url, FILTER_VALIDATE_URL) !== false;
    }

    /**
     * 构建URL查询参数
     * @param array $params 参数数组
     * @return string 查询字符串
     */
    public static function buildQuery($params)
    {
        return http_build_query($params);
    }

    /**
     * 解析URL并返回其组成部分
     * @param string $url 要解析的URL
     * @return array|false URL组成部分数组，失败时返回false
     */
    public static function parse($url)
    {
        return parse_url($url);
    }

    /**
     * 合并基础URL和路径
     * @param string $baseUrl 基础URL
     * @param string $path 路径
     * @return string 完整URL
     */
    public static function combine($baseUrl, $path)
    {
        return rtrim($baseUrl, '/') . '/' . ltrim($path, '/');
    }

        /**
     * 添加或更新URL参数
     * @param string $url 原始URL
     * @param array $params 要添加的参数
     * @return string 处理后的URL
     */
    public static function addParams($url, $params)
    {
        if (empty($params)) {
            return $url;
        }

        $urlParts = parse_url($url);
        if ($urlParts === false) {
            return $url;
        }

        // 解析现有查询参数
        $query = [];
        if (isset($urlParts['query'])) {
            parse_str($urlParts['query'], $query);
        }

        // 合并新参数
        $query = array_merge($query, $params);

        // 重新构建URL
        $newUrl = $urlParts['scheme'] . '://' . $urlParts['host'];
        if (isset($urlParts['port'])) {
            $newUrl .= ':' . $urlParts['port'];
        }
        if (isset($urlParts['path'])) {
            $newUrl .= $urlParts['path'];
        }

        $queryString = http_build_query($query);
        if (!empty($queryString)) {
            $newUrl .= '?' . $queryString;
        }

        if (isset($urlParts['fragment'])) {
            $newUrl .= '#' . $urlParts['fragment'];
        }

        return $newUrl;
    }

    /**
     * 获取URL中的指定参数值
     * @param string $url URL地址
     * @param string $paramName 参数名称
     * @return string|null 参数值，不存在时返回null
     */
    public static function getParam($url, $paramName)
    {
        $urlParts = parse_url($url);
        if (!isset($urlParts['query'])) {
            return null;
        }

        $query = [];
        parse_str($urlParts['query'], $query);

        return isset($query[$paramName]) ? $query[$paramName] : null;
    }

    /**
     * 移除URL中的指定参数
     * @param string $url URL地址
     * @param array $paramNames 要移除的参数名称数组
     * @return string 处理后的URL
     */
    public static function removeParams($url, $paramNames)
    {
        $urlParts = parse_url($url);
        if (!isset($urlParts['query']) || empty($paramNames)) {
            return $url;
        }

        $query = [];
        parse_str($urlParts['query'], $query);

        // 移除指定参数
        foreach ($paramNames as $paramName) {
            unset($query[$paramName]);
        }

        // 重新构建URL
        $newUrl = $urlParts['scheme'] . '://' . $urlParts['host'];
        if (isset($urlParts['port'])) {
            $newUrl .= ':' . $urlParts['port'];
        }
        if (isset($urlParts['path'])) {
            $newUrl .= $urlParts['path'];
        }

        $queryString = http_build_query($query);
        if (!empty($queryString)) {
            $newUrl .= '?' . $queryString;
        }

        if (isset($urlParts['fragment'])) {
            $newUrl .= '#' . $urlParts['fragment'];
        }

        return $newUrl;
    }

}